Contents

这是一个 vc 的 init 方法。

- (instancetype)init {
    self = [super init];
    if (self) {
    //do bala bala
    }

    return self;
}

这是一个 vc 的 viewDidLoad 方法。

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

通常情况下 init 会先执行(实际上一直都是先执行)。

然而,如果在 init 中有调用 self.view (Access to the view)的动作的话,情况就变得不一样了。

- (instancetype)init {
    self = [super init];
    if (self) {
        UITableView *tableView = [UITableView new];
        [self.view addSubView:v];
    }

    return self;
}

vc 会从 self = [super init]; 开始执行一直走到 [self.view addSubView:v]; 之前提前跳到 viewDidLoad 方法,执行完毕才会回到 [self.view addSubView:v]; 继续执行。

  • 试想一下,如果在 viewDidLoad 中设置了一个 hud 并且是 add 到 self.view 上的,按照这个顺序,接下来 self.view 中会在 init 方法中 add 一个 UITableView 。这样一来根据 add 的先后顺序,hud 会在 UITableView 的下方不可见

  • 如果在 init 方法中有对 NSMutableArray 类似的变量初始化动作

      NSMutableArray *array = [@[] mutableCopy];
    

viewDidLoad 中有用到的话由于还没有来得及初始化就发送消息,addObject 这样的操作便是无效的。

Contents